package 代码随想录_回溯.力扣_回溯.岛屿系列;

/**
 * @author zx
 * @create 2022-08-12 23:41
 */
public class 统计封闭岛屿的数目_1254 {

    /**
     * 这道题就特殊了,和之前的不一样(本题陆地是0,其它陆地是1)
     * @param grid
     * @return
     */
    public int closedIsland(int[][] grid) {
        int res = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 0) {
                    if (dfs(grid, i, j)) {
                        res++;
                    }
                }
            }
        }
        return res;
    }

    /**
     * 如果使用短路与&&的话,那么一遇到某次dfs的结果为false,短路与后面跟着的dfs就被忽略了
     * 导致本来同属于一块岛屿的区域并没有一次遍历干净
     */
    public boolean dfs(int[][] grid, int i, int j) {
        if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length){
            return false;
        }
        if (grid[i][j] == 1){
            return true;
        }
        grid[i][j] = 1;
        return  dfs(grid, i - 1, j) &
                dfs(grid, i + 1, j) &
                dfs(grid, i, j - 1) &
                dfs(grid, i, j + 1);
    }

}
